#ifndef __INTERACTIVEMODE_H__
#define __INTERACTIVEMODE_H__
#include "PacketBase.h"
#include "LinkBase.h"

/*
    已知参数： 1. 数据通道连接：LinkBase  2.数据包 PacketBase
    功能说明： 基于 连接LinkBase 的 数据包 PacketBase 收送管控
             方式   
             1） 只发不收
             2） 一发一收
             3） 接收一包    
*/
/// @brief 收送模式管理
namespace controller
{
    typedef std::function<PacketBase *(LinkBase *l)> PacketBuild;
    typedef std::function<void(LinkBase *l, PacketBase *r)> PacketGet;
    typedef std::function<void(LinkBase *l)> PacketTimeout;
    class IMode
    {
    public:
        static const int Wait_always = -1;
        // 1.发送->不接收
        static int S1(LinkBase *l, PacketBase *p);
        static int S1(LinkBase *l, PacketBuild p);
        // 2. 发送 ->接收(阻塞)
        static int S2(LinkBase *l, PacketBuild b, PacketBase *r, PacketGet g, int g_timeout_ms,PacketTimeout tfn=nullptr);
        static int S2(LinkBase *l, PacketBase *p, PacketBase *r, PacketGet g, int g_timeout_ms,PacketTimeout tfn=nullptr);

        // 3. 接收
        static int W(LinkBase *l, PacketBase *r, PacketGet g, int g_timeout_ms,int counter = 1,PacketTimeout tfn=nullptr);


        // //4. 数据采集
        // M((){

        //     for(int i=0;i<items.count;i++){
        //         PacketBase*pp;
        //         build_packet_with_config(pp,config_item);
        //         S2(pp,(p){
        //             de = decode(p);
        //             save(de);
        //         },(){
        //             return; //next
        //         });
        //     }
        // });

        // //5. 后台交互
        // MI((){
        //     //1）被动接收数据包,处理命令
        //     W((pp){
        //         cmd(pp); 
        //     });
        //     //2）主动上报数据
        //     if(flag){
        //         ...
        //         build(pp);
        //         S2((pp),(){

        //         });
        //     };
        //     //3) 升级
            

        // });

    };
};

#endif // ! __INTERACTIVEMODE_H__